package br.ufrn.cerescaico.sepe.dao;

import br.ufrn.cerescaico.sepe.Sepe;
import br.ufrn.cerescaico.sepe.beans.Atividade;
import br.ufrn.cerescaico.sepe.beans.Participante;
import br.ufrn.cerescaico.sepe.dao.util.DataAccessLayerException;
import br.ufrn.cerescaico.sepe.dao.util.HibernateFactory;
import br.ufrn.cerescaico.sepe.dao.util.PagerBean;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 * Classe de dados do bean atividade.
 * @author Taciano Morais Silva
 * @version 27/08/2010, 12h11m
 * @since 27/08/2010, 12h00m
 */
public class AtividadeDao extends AbstractDao<Atividade> implements Dao<Atividade> {

    public AtividadeDao(Sepe sepe) throws DataAccessLayerException {
        super(sepe);
    }

    /**
     *
     * @throws DataAccessLayerException
     */
    public AtividadeDao() throws DataAccessLayerException {
        super();
    }

    /**
     * Insert a new Event into the database.
     * @param event
     */
    @Override
    public void create(Atividade atividade) throws DataAccessLayerException {
        super.saveOrUpdate(atividade);
    }

    @Override
    public void update(Atividade atividade) throws DataAccessLayerException {
        super.saveOrUpdate(atividade);
    }

    @Override
    public void delete(Integer id) throws DataAccessLayerException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * Delete a detached Event from the database.
     * @param event
     */
    @Override
    public void delete(Atividade atividade) throws DataAccessLayerException {
        super.delete(atividade);
    }

    @Override
    public Atividade find(Integer id) throws DataAccessLayerException {
        return (Atividade) super.find(Atividade.class, id);
    }

    @Override
    public List<Atividade> findAll() throws DataAccessLayerException {
        return super.findAll(Atividade.class);
    }
    
    public List<Atividade> listar(PagerBean pager) throws DataAccessLayerException {
        List<Atividade> atividades = null;
        try {
            startOperation();
            Criteria criteria = session.createCriteria(Atividade.class);
            Criteria count = session.createCriteria(Atividade.class);

            //projeção para a contagem de registros
            count.setProjection(Projections.rowCount());
            Object obj = count.uniqueResult();
            int total = ((Long) count.uniqueResult()).intValue();
            pager.setTotalResults(total);

            //setando os falores do primeiro registro e do número máximo de registros.
            criteria.setFirstResult(pager.getFirstResult());
            criteria.setMaxResults(pager.getMaxResults());
            criteria.addOrder(Order.asc("categoria"));
            atividades = (List<Atividade>) criteria.list();
            tx.commit();
        } catch (HibernateException e) {
            handleException(e);
        } finally {
            HibernateFactory.close(session);
        }
        return atividades;
    }

    public List<Atividade> pesquisar(String horario) throws DataAccessLayerException {
        List<Atividade> atividades = null;
        try {
            startOperation();
            Criteria criteria = session.createCriteria(Atividade.class);
            if (horario != null && !horario.equals("")) {
                criteria.add(Restrictions.eq("horario", horario));
            }
            criteria.add(Restrictions.ne("categoria", "Mesa Temática"));
            criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
            atividades = (List<Atividade>)criteria.list();
            tx.commit();
        } catch (HibernateException e) {
            handleException(e);
        } finally {
            HibernateFactory.close(session);
        }
        return atividades;
    }

    public List<Atividade> pesquisar(Participante participante) throws DataAccessLayerException {
        List<Atividade> atividades = null;
        try {
            startOperation();
            Criteria criteria = session.createCriteria(Atividade.class);
            if (participante != null && participante.getId() != null) {
                criteria.createCriteria("participantes").add(Restrictions.eq("id", participante.getId()));
            }
            criteria.add(Restrictions.ne("categoria", "Mesa Temática"));
            criteria.addOrder(Order.asc("categoria"));
            //criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
            atividades = (List<Atividade>)criteria.list();
            tx.commit();
        } catch (HibernateException e) {
            handleException(e);
        } finally {
            HibernateFactory.close(session);
        }
        return atividades;
    }
}
